#include <QGuiApplication>
#include <QCoreApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QFileInfo>
#include <QDir>
#include "sflog/sflog.h"
#include "interface/uiinterface.h"
#include "sensor/sensor.h"
#include "udp/udp.h"
// 日志显示模式：true=只显示文件名，false=显示相对路径（项目根相对）
constexpr bool LOG_SHOW_FILENAME = false;

void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    // 1️⃣ 日志等级和颜色
    QString level;
    QString color;

    switch (type) {
    case QtDebugMsg:    level = "DBUG";  color = "\033[36m"; break; // 青色
    case QtInfoMsg:     level = "INFO";  color = "\033[32m"; break; // 绿色
    case QtWarningMsg:  level = "WARN";  color = "\033[33m"; break; // 黄色
    case QtCriticalMsg: level = "ERR ";  color = "\033[31m"; break; // 红色
    case QtFatalMsg:    level = "FATAL"; color = "\033[41;1m"; break; // 红底加粗
    }

    // 2️⃣ 文件名或相对路径
    QString filePath;
//    if (LOG_SHOW_FILENAME) {
        filePath = QFileInfo(context.file).fileName();
    // } else {
    //     // 尝试显示相对路径（取最后三段目录+文件名）
    //     QStringList parts = context.file.split(QDir::separator());
    //     int count = parts.size();
    //     if (count >= 3)
    //         filePath = parts[count-3] + "/" + parts[count-2] + "/" + parts[count-1];
    //     else
    //         filePath = QFileInfo(context.file).fileName();
    // }

    // 3️⃣ 格式化日志
        // QString log = QString("%1 [%2] %3:%4 %5%6\033[0m")
        //                   .arg(QDateTime::currentDateTime().toString("HH:mm:ss.zzz"))   // 时间
        //                   .arg((quintptr)QThread::currentThreadId(), 0, 16)             // 线程ID
        //                   .arg(filePath)                                                // 文件名或相对路径
        //                   .arg(context.line)                                            // 行号
        //                   .arg(color)                                                   // 颜色
        //                   .arg(msg);                                                    // 日志内容

    // 4️⃣ 输出到控制台
    // std::cout<<log.toLocal8Bit().constData()<<std::endl;
    // fprintf(stderr, "%s\n", );
    // fflush(stderr);

    // 5️⃣ Fatal 直接中止
    if (type == QtFatalMsg)
        abort();
}
int main(int argc, char *argv[])
{

    // 安装自定义日志处理器
qSetMessagePattern( // 基础信息（所有日志级别共有）
 "%{time process} "
 "[%{threadid}] "
  #ifdef QT_DEBUG 
  // Debug 信息（青色） 
  "%{if-debug}\033[32m%{endif}" 
  // Info 信息（绿色） 
  "%{if-info}\033[37m%{endif}" 
  // Warning 信息（黄色） 
  "%{if-warning}\033[33m%{endif}" 
  // Critical 信息（红色） 
  "%{if-critical}\033[31m%{endif}" 
  // Fatal 信息（红色加粗+背景高亮）
  "%{if-fatal}\033[41;1m%{endif}"
#endif
  // 日志类型标签（带条件颜色） 
  "%{if-debug}[DBUG] %{endif}"
  "%{if-info}[INFO] %{endif}"
   "%{if-warning}[WARN] %{endif}" 
   "%{if-critical}[ERR ] %{endif}" 
   "%{if-fatal}[FATAL]%{endif}"
    // 可选：应用模块分类 
    "%{if-category}%{category}:%{endif}" 
  //  #ifdef QT_DEBUG
    // 源代码位置（调试用） 
    "%{function}:%{line} - "
//     #endif
    // 日志消息主体 
    "%{message}" 
    #ifdef QT_DEBUG 
    // 重置颜色（所有带颜色的日志都需要） 
    "\033[0m"
     #endif
     // 致命错误追加调用栈（需启用 QT_MESSAGE_PATTERN 环境变量） 
     //"%{if-fatal}\nBacktrace: %{backtrace depth=20 separator=\"\n\"}%{endif}" );
);
    SfLogger::instance();
//#ifndef QT_DEBUG

    qInstallMessageHandler(SfLogger::customMessageHandler);
//#endif
    qDebug()<<"step1";
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
    QGuiApplication app(argc, argv);
    QCoreApplication::setAttribute(Qt::AA_DontCheckOpenGLContextThreadAffinity);
    qmlRegisterSingletonInstance("UIModule", 1, 0, "UI", UIINTERFACE);
    QQmlApplicationEngine engine;


    // 添加 import path，确保 QML 引擎能找到 "UIModule"
    engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml");

    const QUrl url(QStringLiteral("qrc:/qml/main.qml"));
    qDebug()<<"step2";
    QObject::connect(
        &engine,
        &QQmlApplicationEngine::objectCreated,
        &app,
        [url](QObject *obj, const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        },
        Qt::QueuedConnection);
    engine.load(url);
    qDebug()<<"step3";
    QTimer::singleShot(1000,[](){
            qDebug()<<"step4";
        auto client = new TcpClient();
        auto udp = new UDP();
        SENSORINTERFACE->set_sendCallBack([=](QByteArray d){
            udp->write(d);
            client->write(d);
        });
    });
    // QObject::connect(QGuiApplication::instance(), &QGuiApplication::applicationStateChanged,
    //                  [](Qt::ApplicationState state){
    //                      if (state == Qt::ApplicationSuspended) {
    //                          qDebug() << "App suspended, stop rendering";
    //                      } else if (state == Qt::ApplicationActive) {
    //                          qDebug() << "App active, resume rendering";
    //                      }
    //                  });
    return app.exec();
}
